/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logica;

import dao.GrupoDAO;
import dao.HistorialDAO;
import dao.LecturaDAO;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Time;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import modelo.Grupo;
import modelo.GrupoLectura;
import modelo.GrupoLecturaPK;
import modelo.Historial;
import modelo.Lectura;
import modelo.Sustrato;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import vista.panel.InterfazInicio;

/**
 *
 * @author Elias Mendoza
 */
public class AlmacenaLectura {

  InterfazInicio p;
  private int dia_noche;
  public AlmacenaLectura(InterfazInicio p) {
    this.p = p;
  }

  public Historial verificaInsertaHistorial(int dn) {
//    RegistroXML registro = new RegistroXML();
    HistorialDAO historialDAO = new HistorialDAO();
    Historial historial = historialDAO.ultimoRegistro();
    FechaHora fechaHora = new FechaHora();

    if (historial != null) {
      if ((!historial.getFecha().equals(fechaHora.getFecha())) || (historial.getDiaNoche() != dn)) {
        historial = new Historial();
        historial.setDiaNoche(dn);
        historial.setFecha(fechaHora.getFecha());
        historialDAO = new HistorialDAO();
        historialDAO.guardar(historial);
//        registro.updateIdHistorial(historial.getId() + "");
      }
    } else {
      historial = new Historial();
      historial.setDiaNoche(dn);
      historial.setFecha(fechaHora.getFecha());
      historialDAO = new HistorialDAO();
      historialDAO.guardar(historial);
//      registro.updateIdHistorial(historial.getId() + "");
    }
    p.jLabelFechaUlt.setText("" + historial.getFecha());
    return historial;
  }
  
   public float getHumedad(float hum, float valReferencia) {
    DecimalFormat df = new DecimalFormat("0.00");
    float humedad = (float) 0.00;
    humedad = hum * 100 / valReferencia;
    return humedad;
  }

  public Lectura registraLectura(ArrayList<GrupoSensores> grupoSensores, Sustrato sustrato) {
    int i = 65;
    Lectura objLectura = null;
    LecturaDAO lecturaDAO = new LecturaDAO();
    Grupo objGrupo = null;
    Class clase;
    Object objeto;
    Method set;
    Class[] claseParametro;
    Object[] parametro;
    char letra;
    DefaultCategoryDataset dataset = new DefaultCategoryDataset();
    String lec = "Lectura Registrada";
    if (p.jTableRegistrosInsertados.getModel().getRowCount() > 0) {
      p.accion.vaciaTabla();
    }
    try {
      clase = Class.forName("modelo.Lectura");
      objeto = clase.newInstance();
      claseParametro = new Class[1];
      claseParametro[0] = Class.forName("java.lang.Float");
      for (GrupoSensores gs : grupoSensores) {
        int con = 1;
        String grupo = gs.getGrupo();
        for (String f : gs.getLectura()) {
          String humedad = String.format("%.2f", (getHumedad(Float.parseFloat(f), Float.parseFloat(gs.getVal_ref()))));
          letra = (char) i;
          set = clase.getMethod("set" + letra, claseParametro);
          parametro = new Object[1];
          parametro[0] = Float.parseFloat(f);
          set.invoke(objeto, parametro);
          dataset.setValue(Float.parseFloat(humedad), "grupo: " + grupo, "" + letra);
          System.out.println("Nombre Sustrato: "+sustrato.getNombre());
          p.accion.addFila(sustrato.getNombre(),grupo + "[" + letra + "]"+con, humedad + "%", gs.getVal_ref().toString());
          i++;
          con++;
        }
        dia_noche = gs.getVal_dn();
      }
      objLectura = (Lectura) objeto;
      asignaHoraHistorialSustratoToLectura(objLectura, sustrato);
      lecturaDAO.guardar(objLectura);
      registraTablaSustratoGrupo(grupoSensores, objLectura);

      System.out.println(objLectura.toString());
      dibujaGrafica(dataset, sustrato);
    } catch (NoSuchMethodException e) {
      System.out.println("Error al acceder al metodo. " + e);
    } catch (SecurityException e) {
      System.out.println("Error al acceder al metodo. " + e);
    } catch (InvocationTargetException e) {
      System.out.println("Error al ejecutar el metodo. " + e);
    } catch (InstantiationException e) {
      System.out.println("Error al instanciar el objeto. " + e);
    } catch (IllegalAccessException e) {
      System.out.println("Error al instanciar el objeto. " + e);
    } catch (ClassNotFoundException e) {
      System.out.println("No se ha encontrado la clase");
    }
    return objLectura;
  }

  public void dibujaGrafica(DefaultCategoryDataset dataset, Sustrato sustrato) {
    JFreeChart chart = ChartFactory.createLineChart("Humedad de " + sustrato.getNombre(), "Lectura",
            "Humedad", dataset, PlotOrientation.VERTICAL, true, true, false);

    ChartPanel grafico = new ChartPanel(chart);
    p.accion.aderirPanel(grafico, p.jPanelContenedorComportamiento);
  }

  public void asignaHoraHistorialSustratoToLectura(Lectura l, Sustrato sus) {
    Lectura lectura = l;
    Date tiempoSistema = new Date();
    SimpleDateFormat formatoHora = new SimpleDateFormat("HH:mm:ss");
    Time hora = Time.valueOf(formatoHora.format(tiempoSistema).toString());

    lectura.setHora(hora);
    lectura.setHistorial(verificaInsertaHistorial(dia_noche));
    lectura.setSustrato(sus);

    p.jLabelHoraUlt.setText("" + hora);
  }

  public void registraTablaSustratoGrupo(ArrayList<GrupoSensores> grupoSensores, Lectura l) {
    GrupoLectura grupoLectura = new GrupoLectura();
    GrupoLecturaPK grupoLecturaPK = new GrupoLecturaPK();
    GrupoDAO grupoDAO = new GrupoDAO();

    for (GrupoSensores gs : grupoSensores) {
      grupoLectura.setEstadoValvula(Integer.parseInt(gs.getVal_sta()));
      grupoLecturaPK.setGrupoFK(grupoDAO.getGrupoByToGrupo(gs.getGrupo()));
      grupoLecturaPK.setLecturaFK(l);
      //asignamos llave primaria compuesta
      grupoLectura.setPrimaryKey(grupoLecturaPK);
      grupoDAO.guardar(grupoLectura);
    }
    //contenedorCom.getUltRegistro().setText("" + l.getId());
  }
}
